package view;

import java.awt.BorderLayout;
import java.awt.Component;
import java.lang.reflect.Array;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map.Entry;

import javax.swing.ImageIcon;
import javax.swing.JFrame;
import javax.swing.JScrollPane;
import javax.swing.JTree;
import javax.swing.ScrollPaneConstants;

import javax.swing.event.TreeSelectionEvent;
import javax.swing.event.TreeSelectionListener;
import javax.swing.tree.DefaultMutableTreeNode;
import javax.swing.tree.DefaultTreeCellRenderer;
import javax.swing.tree.DefaultTreeModel;
import javax.swing.tree.TreeNode;
import javax.swing.tree.TreePath;
import javax.swing.tree.TreeSelectionModel;

import constants.PantallaConstants;

public class ExploradorDeDiagramas implements TreeSelectionListener  {

	private JTree tree;
	private DefaultMutableTreeNode mySeleecion;
	private String seleccion;
	//private DefaultMutableTreeNode principal;
			
	public ExploradorDeDiagramas() {
				
		
		DefaultMutableTreeNode root = new DefaultMutableTreeNode("NONE");
		tree = new JTree(root);
		/*
		ImageIcon leafIcon = new ImageIcon(PantallaConstants.IMAGEN_HERRAMIENTA);
		if (leafIcon != null) {
		    DefaultTreeCellRenderer renderer = 
		        new DefaultTreeCellRenderer();
		    renderer.setLeafIcon(leafIcon);
		    tree.setCellRenderer(renderer);
		}
		*/
		
		//Listen for when the selection changes.
		tree.getSelectionModel().setSelectionMode(TreeSelectionModel.SINGLE_TREE_SELECTION);
		tree.setShowsRootHandles(true);
		tree.addTreeSelectionListener(this); 
		
		
	}


	/**
	 * @param nombreProyecto, para la raiz del explorador
	 * @param listaDiagramas, para armar "el arbol"
	 * @param seleccion, para ver que estoy seleccionando
	 * @param listaEntidades, para mostrar las entidades del diagrama seleccionado
	 */
	public void actualizar(String nombreProyecto, ArrayList<String> listaDiagramas,
			               String seleccion, List<String> listaEntidades ) {
		//Creo los nodos root para el proyecto  y principal para el diagrama principal
		DefaultMutableTreeNode root = new DefaultMutableTreeNode(nombreProyecto);
		
		// como se que lo que selecciono es un diagrama, para distingir entre entidades y los demas objetos:
		seleccion = "Diag:"+seleccion;
		
		//principal = new DefaultMutableTreeNode("Principal");
		JTree newTree = new JTree(root);
		this.seleccion = seleccion;
		
		//Borro el arbol anterior y seteo uno nuevo
		tree.getDropMode();
		tree.setModel(newTree.getModel());
		
		//Tomo el modelo del arbol y agrego el diagrama principal al proyecto
		DefaultTreeModel model = (DefaultTreeModel) tree.getModel();
		//model.insertNodeInto(principal,root, 0);
		//int i = 0;
		
		if (seleccion.equalsIgnoreCase(nombreProyecto))
			mySeleecion = root;
		
		Iterator<String> elemtHijos= listaDiagramas.iterator(); 
		 construirArbol(model,root,elemtHijos,true, listaEntidades);
			 
			
		
		tree.setExpandsSelectedPaths(true);
		tree.setSelectionPath( new TreePath( mySeleecion.getPath() ) );
		tree.repaint();
		
	}
	

	private void construirArbol(DefaultTreeModel model, DefaultMutableTreeNode padre,Iterator<String> elemtHijos,
			                    boolean sonDiagramas, List<String> listaEntidades){
		
		int i = 0;
		while(elemtHijos.hasNext()){
			String hijo = elemtHijos.next();
			
			if (sonDiagramas)
				hijo = "Diag:"+hijo;
			else hijo = "Ent:"+hijo;
			
			DefaultMutableTreeNode nodoHijo = new DefaultMutableTreeNode(hijo);
			if (seleccion.equalsIgnoreCase(hijo))
			{
				mySeleecion = nodoHijo;
				model.insertNodeInto(nodoHijo,padre,i);
		   	 	i++;
		   	 	Iterator<String> itEntidades = listaEntidades.iterator(); 
		   	 	construirArbol(model,nodoHijo,itEntidades, false, null);
			}else{
				model.insertNodeInto(nodoHijo,padre,i);
		   	 	i++;
			}
				
				
			/*
			ArrayList<String> tempList = hashMap.get(hijo);
			 if(tempList!=null){
				 Iterator<String> itHijos= tempList.iterator(); 
				 construirArbol(model,nodoHijo,itHijos,hashMap , false);
			 } 
			 */
	   		
		}
	}
	
	
	
	public void valueChanged(TreeSelectionEvent e) {
		//Returns the last path element of the selection.
		//This method is useful only when the selection model allows a single selection.
		    DefaultMutableTreeNode node = (DefaultMutableTreeNode)
		                       tree.getLastSelectedPathComponent();

		    if (node == null)
		    //Nothing is selected.     
		    return;
		    Pantalla p = Pantalla.getPantalla();
		    Object nodeInfo = node.getUserObject();
		    if (!node.isRoot()) {
		    	if(nodeInfo.toString().substring(0, 5).equalsIgnoreCase("Diag:")){
		    		//esta forma de subtring me devuelve desde la 5 posicion hasta el final
			    	p.setDiagramaFromPackageExplorer(nodeInfo.toString().substring(5));	
		    	}
		        
		    } else {
		    	//seleccione la raiz, entonces hago como que selecciono el diagrama Principal
		    	//tree.setSelectionPath( new TreePath( principal.getPath() ) );
		    	//p.setDiagramaFromPackageExplorer(principal.toString());
		    }
		}
	
	public JTree getTree() {
		return tree;
	}

}
